home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (C) 1990, 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
- #ident "$Revision: 1.0 $"
-
- #include <bstring.h>
-
- #ifdef INPUT_TEST
- #define _KERNEL
- #include <sys/types.h>
- #undef _KERNEL
- #endif
-
- #include <sys/ioctl.h>
- #include <sys/errno.h>
- #include <sys/termio.h>
- #include <sys/cmn_err.h>
- #include <sys/debug.h>
- #include <sys/param.h>
- #include <sys/kmem.h>
- #include <sys/mload.h>
- #include <string.h>
-
- /* Streams stuff */
- #include "sys/stream.h"
- #include "sys/strids.h"
- #include "sys/stropts.h"
-
- #ifdef INPUT_TEST
- #include <stdio.h>
- #include "inputtest.h"
- #define _KERNEL
- #else
- #include "sys/systm.h"
- #endif /* INPUT_TEST */
-
- /* my stuff */
- #include "sys/shmiq.h"
- #include "sys/idev.h"
- #include "sys/summa.h"
-
- #include <sys/ddi.h>
-
- #ifndef NULL
- #define NULL 0
- #endif
-
-
- #ifndef isdigit
- #define isdigit(c) (((c)>='0')&&((c)<='9'))
- #endif
-
- #define DBGLEVEL 0 /* Use this to control the printing of
- * debugging messages. Set to 0 for
- * no messages (i.e. actual use). Set
- * to 1 for highest level messages.
- * Higher number shows more detailed
- * messages. Max is 4
- */
-
- /*
- * Macros and variables specific to Summagraphics
- * go here
- */
-
- static idevDesc _sum_desc = {
- SUMMA_NAME, /* devName */
- SUMMA_TYPE, /* devType */
- SUMMA_NUM_BUTTONS, /* nButtons */
- SUMMA_NUM_VALUATORS, /* nValuators */
- 0, /* nLEDs */
- 0, /* nStrDpys */
- 0, /* nIntDpys */
- 0, /* nBells */
- 0 /* flags */
- };
-
- static idevValuatorDesc _sum_x_val_desc = {
- SUMMA_VALUATOR_MIN_RESOLUTION, /* hwMinRes */
- SUMMA_VALUATOR_MAX_RESOLUTION, /* hwMaxRes */
- SUMMA_X_VALUATOR_MIN, /* hwMinVal */
- SUMMA_X_VALUATOR_MAX, /* hwMaxVal */
- IDEV_ABSOLUTE, /* possibleModes */
- IDEV_ABSOLUTE, /* mode */
- SUMMA_VALUATOR_RESOLUTION, /* resolution */
- SUMMA_X_VALUATOR_MIN, /* minVal */
- SUMMA_X_VALUATOR_MAX /* maxVal */
- };
-
- static idevValuatorDesc _sum_y_val_desc = {
- SUMMA_VALUATOR_MIN_RESOLUTION, /* hwMinRes */
- SUMMA_VALUATOR_MAX_RESOLUTION, /* hwMaxRes */
- SUMMA_Y_VALUATOR_MIN, /* hwMinVal */
- SUMMA_Y_VALUATOR_MAX, /* hwMaxVal */
- IDEV_ABSOLUTE, /* possibleModes */
- IDEV_ABSOLUTE, /* mode */
- SUMMA_VALUATOR_RESOLUTION, /* resolution */
- SUMMA_Y_VALUATOR_MIN, /* minVal */
- SUMMA_Y_VALUATOR_MAX /* maxVal */
- };
-
-
-
- char dbg_str[50];
-
- void
- dbg_print(char *str)
- {
- cmn_err(CE_DEBUG,str);
- }
-
- static void
- sum_intr( idevInfo *pInfo, unsigned char *str, int len )
- {
- sum_state_t *sum= (sum_state_t *)pInfo;
- unsigned char mask;
- unsigned char state_val;
- int config_info = 0;
- static unsigned char state[8];
-
- if (sum->info.bInfo.nBtn == 4) { /* 4 button puck */
- state[0] = 0; /* no buttons pressed */
- state[1] = 1; /* button 0 (labeled 1) pressed */
- state[2] = 2; /* button 1 (labeled 2) pressed */
- state[3] = 4; /* button 2 (labeled 3) pressed */
- state[4] = 8; /* button 3 (labeled 4) pressed */
- state[5] = 0x09; /* buttons 0 & 3 pressed */
- state[6] = 0x0A; /* buttons 1 & 3 pressed */
- state[7] = 0x0C; /* buttons 2 & 3 pressed */
- }
- else if (sum->info.bInfo.nBtn == 2) { /* Stylus */
- state[0] = 0; /* invalid state */
- state[1] = 0; /* invalid state */
- state[2] = 0; /* invalid state */
- state[3] = 0; /* invalid state */
- state[4] = 0; /* no buttons pressed */
- state[5] = 1; /* button 0 (tip button) pressed */
- state[6] = 2; /* button 1 (barrel button) pressed */
- state[7] = 3; /* buttons 0 & 1 pressed */
- }
- else { /* 5 button puck */
- state[0] = 0; /* no buttons pressed */
- state[1] = 0x10; /* button 4 (on side of puck) pressed */
- state[2] = 8; /* button 3 (labeled 4) pressed */
- state[3] = 4; /* button 2 (labeled 3) pressed */
- state[4] = 2; /* button 1 (labeled 2) pressed */
- state[5] = 1; /* button 0 (labeled 1) pressed */
- state[6] = 0; /* invalid state */
- state[7] = 0; /* invalid state */
- }
-
-
- /*
- =======================================================================
- Summagraphics Tablet Output Format -
- (i.e. MM Packed Binary Report Format )
-
- For Regular or Config Data:
-
- MSB LSB Byte Byte
- 7 6 5 4 3 2 1 0 # Name
- ------------------------------------------------------
- PH PR T Sx Sy Fc Fb Fa 0 FLAGS
- 0 X6 X5 X4 X3 X2 X1 X0 1 LOW_X
- 0 X13 X12 X11 X10 X9 X8 X7 2 HIGH_X
- 0 Y6 Y5 Y4 Y3 Y2 Y1 Y0 3 LOW_Y
- 0 Y13 Y12 Y11 Y10 Y9 Y8 Y7 4 HIGH_Y
-
- For Delta (relative) Data:
-
- MSB LSB Byte Byte
- 7 6 5 4 3 2 1 0 # Name
- ------------------------------------------------------
- PH PR T Sx Sy Fc Fb Fa 0 FLAGS
- 0 X6 X5 X4 X3 X2 X1 X0 1 LOW_X
- 0 Y6 Y5 Y4 Y3 Y2 Y1 Y0 3 HIGH_X
-
- Where:
-
- Fx - Flag bit signifying stylus or cursor button number
-
- Sx or Sy - sign bit for X or Y: 1 is positive, 0 is negative
- (set to 1 for config data)
-
- T - Tablet identifier, choice of 0 or 1
-
- PH - Phasing bit, always 1
-
- PR - Proximity: 0 is "in" proximity, 1 is "out" of proximity
- (set to 0 for config data)
-
- X0 to X13 - X coordinate (or maximum X value at set resolution
- for config data)
-
- Y0 to Y13 - Y coordinate (or maximum Y value at set resolution
- for config data)
-
- For Test Result Data:
-
- MSB LSB Byte Byte
- 7 6 5 4 3 2 1 0 # Name
- ------------------------------------------------------
- T 0 0 0 PR D C A 0 FLAGS
-
- Where:
-
- A analog circuitry test; pass = 1, fail = 0
-
- C cursor/stylous connection and cursor/stylus coil
- operation test; pass = 1, fail = 0
-
- D digital circuitry test: pass = 1, fail = 0
-
- PR cursor/stylus on/off tablet; on = 1, off = 0
-
- T total test result; pass = 1, fail = 0
-
- For Checksum Data:
-
- Six bytes of data in the format:
-
- .#HHHH
-
- Where:
-
- HHHH a hexidecimal number in ascii
-
-
- =======================================================================
- */
- while (len--) {
- if (sum->state==SUMMA_NOT_SYNCHED) {
- if (!(*str & SUMMA_PHASE_BIT)) {
- str++;
- continue;
- }
- else sum->state= SUMMA_FLAGS;
- }
- else if ((sum->state==SUMMA_FLAGS)&&(! (*str&SUMMA_PHASE_BIT))) {
- sum->state= SUMMA_NOT_SYNCHED;
- #if DBGLEVEL == 4
- sprintf(dbg_str,"tablet out of sync\n");
- dbg_print(dbg_str);
- #endif
- str++;
- continue;
- }
- switch (sum->data) {
- case SUMMA_REGULAR_DATA:
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"regular data\n");
- dbg_print(dbg_str);
- #endif
- #if DBGLEVEL == 4
- cmn_err(CE_DEBUG,"Byte 0 is: %x\n",*str);
- *str++;
- cmn_err(CE_DEBUG,"Byte 1 is: %x\n",*str);
- *str++;
- cmn_err(CE_DEBUG,"Byte 2 is: %x\n",*str);
- *str++;
- cmn_err(CE_DEBUG,"Byte 3 is: %x\n",*str);
- *str++;
- cmn_err(CE_DEBUG,"Byte 4 is: %x\n",*str);
- *str++;
- cmn_err(CE_DEBUG,"Byte 5 is: %x\n",*str);
- *str--;
- *str--;
- *str--;
- *str--;
- *str--;
- #endif
-
- switch (sum->state++) {
- case SUMMA_FLAGS:
- sum->flags= *str++;
- break;
- case SUMMA_LOW_X:
- sum->vals.value[0]= (*str++)&0x7f;
- break;
- case SUMMA_HIGH_X:
- sum->vals.value[0]|= ((*str++)&0x7f)<<7;
- if (!((sum->flags)&0x10))
- sum->vals.value[0] = -(sum->vals.value[0]);
- break;
- case SUMMA_LOW_Y:
- sum->vals.value[1]= (*str++)&0x7f;
- break;
- case SUMMA_HIGH_Y:
- sum->vals.value[1]|= ((*str++)&0x7f)<<7;
- if (!((sum->flags)&0x08))
- sum->vals.value[1] = -(sum->vals.value[1]);
-
- sum->vals.value[0] -= sum->xoffset;
- sum->vals.value[1] -= sum->yoffset;
-
- mask = 0x1f;
- state_val = state[sum->flags&0x07];
-
- idevGenValEvents(&sum->info,&sum->vals,IDEV_VALS_ABSOLUTE);
- idevGenBtnEvents(&sum->info,&mask,&state_val);
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"Valuator (X): %d\n", sum->vals.value[0]);
- dbg_print(dbg_str);
- sprintf(dbg_str,"Valuator (Y): %d\n", sum->vals.value[1]);
- dbg_print(dbg_str);
- #endif
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"Button Flags: %x\n", sum->flags&0x07);
- dbg_print(dbg_str);
- sprintf(dbg_str,"Flags: %x\n", sum->flags);
- dbg_print(dbg_str);
- sprintf(dbg_str,"state_val: %x\n", state_val);
- dbg_print(dbg_str);
- #endif
-
- sum->state= SUMMA_FLAGS;
- break;
- default:
- cmn_err(CE_WARN,"Illegal tablet state %d!!\n",sum->state);
- sum->state= SUMMA_NOT_SYNCHED;
- break;
- }
- break;
- case SUMMA_DELTA_DATA:
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"delta data\n");
- dbg_print(dbg_str);
- #endif
- switch (sum->state++) {
- case SUMMA_FLAGS:
- cmn_err(CE_DEBUG,"Byte 0 is: %x\n",*str);
- sum->flags= *str++;
- break;
- case SUMMA_LOW_X:
- cmn_err(CE_DEBUG,"Byte 1 is: %x\n",*str);
- sum->vals.value[0]= (*str++)&0x7f;
- if (!((sum->flags)&0x10))
- sum->vals.value[0] = -(sum->vals.value[0]);
- break;
- case SUMMA_HIGH_X:
- cmn_err(CE_DEBUG,"Byte 2 is: %x\n",*str);
- sum->vals.value[1]= (*str++)&0x7f;
- if (!((sum->flags)&0x08))
- sum->vals.value[1] = -(sum->vals.value[1]);
-
- mask = 0x1f;
- state_val = state[sum->flags&0x07];
-
- idevGenValEvents(&sum->info,&sum->vals,IDEV_VALS_ABSOLUTE);
- idevGenBtnEvents(&sum->info,&mask,&state_val);
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"Valuator Delta (X): %d\n", sum->vals.value[0]);
- dbg_print(dbg_str);
- sprintf(dbg_str,"Valuator Delta (Y): %d\n", sum->vals.value[1]);
- dbg_print(dbg_str);
- #endif
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"Button Flags: %x\n", sum->flags&0x07);
- dbg_print(dbg_str);
- sprintf(dbg_str,"Flags: %x\n", sum->flags);
- dbg_print(dbg_str);
- sprintf(dbg_str,"state_val: %x\n", state_val);
- dbg_print(dbg_str);
- #endif
- sum->state= SUMMA_FLAGS;
- break;
- default:
- cmn_err(CE_WARN,"Illegal tablet state %d!!\n",sum->state);
- sum->state= SUMMA_NOT_SYNCHED;
- break;
- }
- break;
- case SUMMA_CONFIG_INFO:
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"config data\n");
- dbg_print(dbg_str);
- #endif
- switch (sum->state++) {
- case SUMMA_FLAGS:
- sum->flags= *str++;
- break;
- case SUMMA_LOW_X:
- sum->x_resolution = (*str++)&0x7f;
- break;
- case SUMMA_HIGH_X:
- sum->x_resolution |= ((*str++)&0x7f)<<7;
- break;
- case SUMMA_LOW_Y:
- sum->y_resolution = (*str++)&0x7f;
- break;
- case SUMMA_HIGH_Y:
- sum->y_resolution |= ((*str++)&0x7f)<<7;
-
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"X Resolution: %d\n", sum->x_resolution);
- dbg_print(dbg_str);
- sprintf(dbg_str,"Y Resolution: %d\n", sum->y_resolution);
- dbg_print(dbg_str);
- #endif
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"Flags: %x\n", sum->flags);
- dbg_print(dbg_str);
- #endif
-
- sum->state= SUMMA_FLAGS;
- sum->data = SUMMA_REGULAR_DATA;
- break;
- default:
- cmn_err(CE_WARN,"Illegal tablet state %d!!\n",sum->state);
- sum->state= SUMMA_NOT_SYNCHED;
- break;
- }
-
- break;
- default:
- cmn_err(CE_WARN,"Illegal tablet state %d!!\n",sum->state);
- sum->state= SUMMA_NOT_SYNCHED;
- break;
- }
- }
- return;
- }
-
-
- static int
- sum_command( sum_state_t *sum, unsigned char *command )
- {
-
- #if DBGLEVEL >= 1
- sprintf(dbg_str,"sum_command - subroutine started.\n");
- dbg_print(dbg_str);
- #endif
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"sum_command - command: %s \n", command);
- dbg_print(dbg_str);
- sprintf(dbg_str,"sum_command - command length: %d \n",
- strlen(command));
- dbg_print(dbg_str);
- #endif
- if (idevChangeLineSettings(&sum->info,NULL)) {
- mblk_t *mbp;
-
- if (mbp= allocb(strlen(command),BPRI_MED)) {
- strcpy(mbp->b_wptr,command);
- mbp->b_wptr+= strlen(mbp->b_wptr);
- putnext( sum->info.sInfo.wq, mbp );
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"sum_command - message sent.\n");
- dbg_print(dbg_str);
- #endif
- }
- else {
- cmn_err(CE_WARN,"Couldn't allocate streams buffer -- command not completed.\n");
- }
- }
- return 0;
- }
-
- #define SUM_RESET "\040hQAI\040G\040c0"
-
- static int
- sum_reset( sum_state_t *sum)
- {
-
- #if DBGLEVEL >= 1
- sprintf(dbg_str,"sum_reset - subroutine started.\n");
- dbg_print(dbg_str);
- #endif
- if (idevChangeLineSettings(&sum->info,NULL)) {
- mblk_t *mbp;
-
- if (mbp= allocb(strlen(SUM_RESET),BPRI_MED)) {
- strcpy(mbp->b_wptr,SUM_RESET);
- mbp->b_wptr+= strlen(mbp->b_wptr);
- putnext( sum->info.sInfo.wq, mbp );
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"Tablet reset.\n");
- dbg_print(dbg_str);
- #endif
- }
- else {
- cmn_err(CE_WARN,"Couldn't allocate streams buffer -- command not completed.\n");
- }
- }
- return 0;
- }
-
- /* ARGSUSED */
- static int
- sum_other_control(sum_state_t *sum, idevOtherControl *pCtrl)
- {
-
- char sum_string[20], origin, sum_arg[2];
- int x_res_low, x_res_hi, y_res_low, y_res_hi;
- int x_res, y_res, update_value;
- int x_lpi, y_lpi;
- char *p;
-
- #if DBGLEVEL >= 1
- sprintf(dbg_str,"In other control routine.\n");
- dbg_print(dbg_str);
- #endif
-
- /* implement other device controls here */
- pCtrl->name[IDEV_CTRL_NAME_LEN]= '\0';
- pCtrl->data[IDEV_CTRL_DATA_LEN]= '\0';
- if (strcmp(pCtrl->name,"model")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"model\n");
- dbg_print(dbg_str);
- #endif
- if (strcmp(pCtrl->data,"961")==0) {
- sum->model = 961;
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"model is 961\n");
- dbg_print(dbg_str);
- #endif
- }
- else if (strcmp(pCtrl->data,"1201")==0) {
- sum->model = 1201;
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"model is 1201\n");
- dbg_print(dbg_str);
- #endif
- }
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
- else if (strcmp(pCtrl->name,"coordinate")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"coordinate\n");
- dbg_print(dbg_str);
- #endif
- if (strcmp(pCtrl->data,"absolute")==0) {
- sum->mode_modifier = SUMMA_ABSOLUTE;
- sum->data = SUMMA_REGULAR_DATA;
- sum_arg[0] = SUMMA_ABSOLUTE;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"absolute\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"relative")==0) {
- sum->data = SUMMA_DELTA_DATA;
- sum->mode_modifier = SUMMA_RELATIVE;
- sum_arg[0] = SUMMA_RELATIVE;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"relative\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
-
- else if (strcmp(pCtrl->name,"origin")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"origin\n");
- dbg_print(dbg_str);
- #endif
- if (strcmp(pCtrl->data,"upper")==0) {
- sum->origin = SUMMA_ORIGIN_UPPER;
- sum_arg[0] = SUMMA_ORIGIN_UPPER;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"origin-upper\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"lower")==0) {
- sum->origin = SUMMA_ORIGIN_LOWER;
- sum_arg[0] = SUMMA_ORIGIN_LOWER;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"origin: %c\n", origin);
- dbg_print(dbg_str);
- sprintf(dbg_str,"origin-lower\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
-
- else if (strcmp(pCtrl->name,"reporting")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"reporting\n");
- dbg_print(dbg_str);
- #endif
- if (strcmp(pCtrl->data,"point")==0) {
- sum->primary_mode = SUMMA_RPT_POINT;
- sum_arg[0] = SUMMA_RPT_POINT;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"reporting-point\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"remote-mode")==0) {
- sum->primary_mode = SUMMA_RPT_REM_MODE;
- sum_arg[0] = SUMMA_RPT_REM_MODE;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"reporting-remote-mode\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"remote-trig")==0) {
- sum_arg[0] = SUMMA_RPT_REM_TRIG;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"reporting-remote-trig\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"stream")==0) {
- sum->primary_mode = SUMMA_RPT_STREAM;
- sum_arg[0] = SUMMA_RPT_STREAM;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"reporting-stream\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"switch")==0) {
- sum->primary_mode = SUMMA_RPT_SW_STREAM;
- sum_arg[0] = SUMMA_RPT_SW_STREAM;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"reporting-switch\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
-
- else if (strcmp(pCtrl->name,"axis_update")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"axis_update\n");
- dbg_print(dbg_str);
- #endif
- update_value = atoi (pCtrl->data);
- if (update_value >= 0 && update_value <= 90) {
- update_value = update_value + 32;
- sum->mode_modifier = SUMMA_AXIS_UPDATE;
- sprintf(sum_string, "%c%c", SUMMA_AXIS_UPDATE,
- update_value);
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"Axis update value: %d\n", update_value);
- dbg_print(dbg_str);
- sprintf(dbg_str,"Axis update command: %s\n", sum_string);
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_string);
- }
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
-
- else if (strcmp(pCtrl->name,"increment")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"increment\n");
- dbg_print(dbg_str);
- #endif
- update_value = atoi (pCtrl->data);
- if (update_value >= 0 && update_value <= 90) {
- update_value = update_value + 32;
- sum->mode_modifier = SUMMA_INCREMENT;
- sprintf(sum_string, "%c%c", SUMMA_INCREMENT,
- update_value);
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"Increment value: %d\n", update_value);
- dbg_print(dbg_str);
- sprintf(dbg_str,"Increment command: %s\n", sum_string);
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_string);
- }
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
-
- else if (strcmp(pCtrl->name,"rate")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"rate\n");
- dbg_print(dbg_str);
- #endif
- if (strcmp(pCtrl->data,"max")==0) {
- sum_arg[0] = SUMMA_RATE_MAX;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"rate-max\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"max/2")==0) {
- sum_arg[0] = SUMMA_RATE_MAX_2;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"rate-max/2\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"max/8")==0) {
- sum_arg[0] = SUMMA_RATE_MAX_8;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"rate-max/8\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"max/32")==0) {
- sum_arg[0] = SUMMA_RATE_MAX_32;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"rate-max/32\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
-
- else if (strcmp(pCtrl->name,"resolution")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"resolution\n");
- dbg_print(dbg_str);
- #endif
- if (strcmp(pCtrl->data,"1lpi")==0) {
- sum_arg[0] = SUMMA_RES_1LPI;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"res-1lpi\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"2lpi")==0) {
- sum_arg[0] = SUMMA_RES_2LPI;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"res-2lpi\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"4lpi")==0) {
- sum_arg[0] = SUMMA_RES_4LPI;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"res-4lpi\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"100lpi")==0) {
- sum_arg[0] = SUMMA_RES_100LPI;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"res-100lpi\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"200lpi")==0) {
- sum_arg[0] = SUMMA_RES_200LPI;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"res-200lpi\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"400lpi")==0) {
- sum_arg[0] = SUMMA_RES_400LPI;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"res-400lpi\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"500lpi")==0) {
- sum_arg[0] = SUMMA_RES_500LPI;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"res-500lpi\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"1000lpi")==0) {
- sum_arg[0] = SUMMA_RES_1000LPI;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"res-1000lpi\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"10lpmm")==0) {
- sum_arg[0] = SUMMA_RES_10LPMM;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"res-10lpmm\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"20lpmm")==0) {
- sum_arg[0] = SUMMA_RES_20LPMM;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"res-20lpmm\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"40lpmm")==0) {
- sum_arg[0] = SUMMA_RES_40LPMM;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"res-40lpmm\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else {
- int y_val,x_val = atoi(pCtrl->data);
- char *str= pCtrl->data;
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"x_val = %d, y_val = %d\n", x_val, y_val);
- dbg_print(dbg_str);
- #endif
- while ((*str)&&(isdigit(*str)))
- str++;
- if (*str=='/') {
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"Pixel values\n");
- dbg_print(dbg_str);
- #endif
- str++;
- if (isdigit(*str)) {
- x_res = x_val;
- y_res = atoi(str);
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"x_res = %d, y_res = %d\n", x_res, y_res);
- dbg_print(dbg_str);
- #endif
- if (sum->model == 961) {
- #if DBGLEVEL >= 4
- sprintf(dbg_str,"model is 961\n");
- dbg_print(dbg_str);
- #endif
- if (sum->origin == SUMMA_ORIGIN_LOWER) {
- x_res = (x_res/6 + 1) * 6;
- if (x_res > 6 * 508)
- x_res = 6 * 508;
- y_res = (y_res/9 + 1) * 9;
- if (y_res > 9 * 508)
- y_res = 9 * 508;
- }
- else if (sum->origin == SUMMA_ORIGIN_UPPER) {
- x_res = (x_res/9 + 1) * 9;
- if (x_res > 9 * 508)
- x_res = 9 * 508;
- y_res = (y_res/6 + 1) * 6;
- if (y_res > 6 * 508)
- y_res = 6 * 508;
- }
- }
- else if (sum->model == 1201) {
- #if DBGLEVEL >= 4
- sprintf(dbg_str,"model is 1201\n");
- dbg_print(dbg_str);
- #endif
- x_res = (((100 * x_res)/117 + 10) * 117)/100;
- if (10 * x_res > 117 * 508)
- x_res = (117 * 508)/10;
- y_res = (((100 * y_res)/117 + 10) * 117)/100;
- if (10 * y_res > 117 * 508)
- y_res = (117 * 508)/10;
- }
-
- p = sum_string;
-
- sum_string[0] = 'r';
- sum_string[9] = '\0';
-
- x_res_low = x_res & 0x00FF;
- if (x_res_low < 0x10)
- sprintf(p+1,"0%x", x_res_low);
- else
- sprintf(p+1,"%x", x_res_low);
-
- x_res_hi = x_res >> 8;
- if (x_res_hi < 0x10)
- sprintf(p+3,"0%x", x_res_hi);
- else
- sprintf(p+3,"%x", x_res_hi);
-
- y_res_low = y_res & 0x00FF;
- if (y_res_low < 0x10)
- sprintf(p+5,"0%x", y_res_low);
- else
- sprintf(p+5,"%x", y_res_low);
-
- y_res_hi = y_res >> 8;
- if (y_res_hi < 0x10)
- sprintf(p+7,"0%x", y_res_hi);
- else
- sprintf(p+7,"%x", y_res_hi);
-
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"%s\n", sum_string);
- dbg_print(dbg_str);
- sprintf(dbg_str,"Pixel x res value: %d\n", x_res);
- dbg_print(dbg_str);
- sprintf(dbg_str,"Pixel y res value: %d\n", y_res);
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_string);
- }
- else
- cmn_err(CE_WARN,"Resolution format incorrect.\n");
- }
- else if (*str=='|') {
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"LPI values\n");
- dbg_print(dbg_str);
- #endif
- str++;
- if (isdigit(*str)) {
- x_lpi = x_val;
- y_lpi = atoi(str);
- if (x_lpi > 508)
- x_lpi = 508;
- if (y_lpi > 508)
- y_lpi = 508;
- if (sum->model = 961) {
- if (sum->origin == SUMMA_ORIGIN_LOWER) {
- x_res = x_lpi * 6;
- y_res = y_lpi * 9;
- }
- else if (sum->origin == SUMMA_ORIGIN_UPPER) {
- x_res = x_lpi * 9;
- y_res = y_lpi * 6;
- }
- }
- else if (sum->model == 1201) {
- x_res = (((100 * x_res)/117 + 10) * 117)/10;
- y_res = (((100 * y_res)/117 + 10) * 117)/10;
- }
-
- p = sum_string;
-
- sum_string[0] = 'r';
- sum_string[9] = '\0';
-
- x_res_low = x_res & 0x00FF;
- if (x_res_low < 0x10)
- sprintf(p+1,"0%x", x_res_low);
- else
- sprintf(p+1,"%x", x_res_low);
-
- x_res_hi = x_res >> 8;
- if (x_res_hi < 0x10)
- sprintf(p+3,"0%x", x_res_hi);
- else
- sprintf(p+3,"%x", x_res_hi);
-
- y_res_low = y_res & 0x00FF;
- if (y_res_low < 0x10)
- sprintf(p+5,"0%x", y_res_low);
- else
- sprintf(p+5,"%x", y_res_low);
-
- y_res_hi = y_res >> 8;
- if (y_res_hi < 0x10)
- sprintf(p+7,"0%x", y_res_hi);
- else
- sprintf(p+7,"%x", y_res_hi);
-
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"LPI x res value: %d\n", x_res);
- dbg_print(dbg_str);
- sprintf(dbg_str,"LPI y res value: %d\n", y_res);
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_string);
- }
- else
- cmn_err(CE_WARN,"Resolution format incorrect.\n");
- }
- else
- cmn_err(CE_WARN,"Resolution format incorrect.\n");
- }
- }
-
- else if (strcmp(pCtrl->name,"buttons")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"buttons\n");
- dbg_print(dbg_str);
- #endif
- if (strcmp(pCtrl->data,"2")==0)
- sum->info.bInfo.nBtn = 2;
- else if (strcmp(pCtrl->data,"4")==0)
- sum->info.bInfo.nBtn = 4;
- else if (strcmp(pCtrl->data,"5")==0)
- sum->info.bInfo.nBtn = 5;
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
-
- else if (strncmp(pCtrl->name,"scale",5)==0) {
- idevTransform *pTrans= NULL;
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"scale\n");
- dbg_print(dbg_str);
- #endif
- if ((pCtrl->name[5]=='x')||(pCtrl->name[5]=='X')) {
- pTrans= &sum->info.pInfo.xTransform;
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"Doing X scale operation.\n");
- dbg_print(dbg_str);
- #endif
- }
- else if ((pCtrl->name[5]=='y')||(pCtrl->name[5]=='Y')) {
- pTrans= &sum->info.pInfo.yTransform;
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"Doing Y scale operation.\n");
- dbg_print(dbg_str);
- #endif
- }
- else if (isdigit(pCtrl->name[5])) {
- unsigned n= atoi(&pCtrl->name[5]);
- if (n<sum->info.vInfo.nVal)
- pTrans= &sum->info.vInfo.transform[n];
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"Doing numbered scale operation.\n");
- dbg_print(dbg_str);
- #endif
- }
- if ((pTrans!=NULL)&&(isdigit(pCtrl->data[0]))) {
- int denom,num= atoi(pCtrl->data);
- char *str= pCtrl->data;
- while ((*str)&&(isdigit(*str)))
- str++;
- if (*str=='/')
- str++;
- if (isdigit(*str))
- denom= atoi(str);
- else denom= 1;
- if (num==0) num= 1;
- if (denom==0) denom= 1;
-
- pTrans->numerator= num;
- pTrans->denominator= denom;
- }
- }
-
- else if (strcmp(pCtrl->name,"tablet")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"tablet\n");
- dbg_print(dbg_str);
- #endif
- if (strcmp(pCtrl->data,"0")==0) {
- sum_arg[0] = SUMMA_0;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"tablet-select0\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"1")==0) {
- sum_arg[0] = SUMMA_1;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"tablet-select1\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
-
- else if (strcmp(pCtrl->name,"control")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"control\n");
- dbg_print(dbg_str);
- #endif
- if (strcmp(pCtrl->data, "xon")==0) {
- sum_arg[0] = SUMMA_XON;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"control-xon\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"xoff")==0) {
- sum_arg[0] = SUMMA_XOFF;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"control-xoff\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"reset")==0) {
- sum_arg[0] = SUMMA_RESET;
- sum_arg[1] = '\0';
- sum_reset(sum);
- }
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
-
- else if (strcmp(pCtrl->name,"diag")==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"diag\n");
- dbg_print(dbg_str);
- #endif
- if (strcmp(pCtrl->data, "selftest")==0) {
- sum_arg[0] = SUMMA_SELFTEST;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"diag-selftest\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data, "test_results")==0) {
- sum->data = SUMMA_TEST_RESULTS;
- sum_arg[0] = SUMMA_SEND_RESULTS;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"diag-test-results\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data,"echo")==0) {
- sum->data = SUMMA_ECHO;
- sum_arg[0] = SUMMA_ECHO;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"diag-echo\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data, "codecheck")==0) {
- sum->data = SUMMA_CODECHECK;
- sum_arg[0] = SUMMA_CODECHECK;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"diag-codecheck\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data, "get_config")==0) {
- sum->data = SUMMA_CONFIG_INFO;
- sum_arg[0] = SUMMA_GET_CONFIG;
- sum_arg[1] = '\0';
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"diag-getconfig\n");
- dbg_print(dbg_str);
- #endif
- sum_command(sum,sum_arg);
- }
- else if (strcmp(pCtrl->data, "read_config")==0) {
- }
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
-
- else if (strncmp(pCtrl->name,"offset",6)==0) {
- #if DBGLEVEL >= 2
- sprintf(dbg_str,"offset\n");
- dbg_print(dbg_str);
- #endif
- if ((pCtrl->name[6]=='x')||(pCtrl->name[6]=='X')) {
- sum->xoffset = atoi (pCtrl->data);
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"x offset: %d\n");
- dbg_print(dbg_str);
- #endif
- }
- else if ((pCtrl->name[6]=='y')||(pCtrl->name[6]=='Y')) {
- sum->yoffset = atoi (pCtrl->data);
- #if DBGLEVEL >= 3
- sprintf(dbg_str,"x offset: %d\n");
- dbg_print(dbg_str);
- #endif
- }
- else
- cmn_err(CE_WARN,"Incorrect option - no changes made.\n");
- }
- return 0;
- }
-
- #define SUM_INIT "\040F\100Tj"
-
- static int
- sum_init( sum_state_t *sum )
- {
- if (idevChangeLineSettings(&sum->info,NULL)) {
- mblk_t *mbp;
-
- if (mbp= allocb(strlen(SUM_INIT),BPRI_MED)) {
- strcpy(mbp->b_wptr,SUM_INIT);
- mbp->b_wptr+= strlen(mbp->b_wptr);
- putnext( sum->info.sInfo.wq, mbp );
- #if DBGLEVEL >= 1
- sprintf(dbg_str,"Tablet Initialized.\n");
- dbg_print(dbg_str);
- #endif
- }
- else {
- cmn_err(CE_WARN,"Couldn't allocate streams buffer -- tablet not initialized.\n");
- }
- }
- return 0;
- }
-
-
- static int
- sum_wioctl( idevInfo *pInfo, int cmd, int size, char *stuff, int *pFound )
- {
- sum_state_t *sum= (sum_state_t *)pInfo;
- int ok = 0, found = 0;
-
- switch ( cmd ) {
- case IDEVGETDEVICEDESC:
- found++;
- if (size>=sizeof(idevDesc)) {
- *((idevDesc *)stuff)= _sum_desc;
- ((idevDesc *)stuff)->nValuators=
- sum->vals.nValuators;
- ok= 1;
- }
- break;
- case IDEVGETVALUATORDESC:
- found++;
- if (size>=sizeof(idevGetSetValDesc))
- ok = idevGetValDesc(&sum->info,
- (idevGetSetValDesc*)stuff);
- break;
- case IDEVPTRCONTROL:
- found++;
- if (size>=sizeof(idevPtrControl))
- ok = idevSetPtrCtrl(&sum->info,
- (idevPtrControl *)stuff);
- break;
- case IDEVGETBUTTONS:
- found++;
- if (size>=idevSize(SUMMA_NUM_BUTTONS)) {
- stuff[0]= sum->bstate;
- ok = 1;
- }
- break;
- case IDEVGETVALUATORS:
- found++;
- if (size>=sizeof(idevValuatorState))
- ok = idevGetValState(&sum->info,
- (idevValuatorState*)stuff);
- break;
- case IDEVENABLEBUTTONS:
- found++;
- if (size>=sizeof(idevBitVals)) {
- idevBitVals *vals= (idevBitVals *)stuff;
- ok= 1;
- sum->bactive &= ~vals->mask[0];
- sum->bactive |= (vals->mask[0]&vals->value[0]);
- }
- break;
- case IDEVENABLEVALUATORS:
- found++;
- if (size>=sizeof(idevBitVals)) {
- idevBitVals *vals= (idevBitVals *)stuff;
- ok= 1;
- sum->vactive &= ~vals->mask[0];
- sum->vactive |= (vals->mask[0]&vals->value[0]);
- }
- break;
- case IDEVSETVALUATORS:
- found++;
- if (size>=sizeof(idevValuatorState))
- ok = idevGenValEvents(&sum->info,
- (idevValuatorState *)stuff,
- IDEV_NO_TRANSFORM|IDEV_VALS_ABSOLUTE
- |QE_RESPONSE);
- break;
- case IDEVCHANGEVALUATORS:
- found++;
- if (size>=sizeof(idevValuatorState))
- ok = idevGenValEvents(&sum->info,
- (idevValuatorState *)stuff,
- IDEV_NO_TRANSFORM|QE_RESPONSE);
- break;
- case IDEVSETVALUATORDESC:
- found++;
- if (size>=sizeof(idevGetSetValDesc)) {
- ok = idevSetValDesc(&sum->info,
- (idevGetSetValDesc *)stuff);
- }
- break;
- case IDEVSETPTRMODE:
- found++;
- if (size>=sizeof(idevPtrMode))
- ok = idevSetPtrMode(&sum->info,
- (idevPtrMode *)stuff);
- break;
- case IDEVSETPTRBOUNDS:
- found++;
- if (size>=sizeof(idevPtrBounds))
- ok = idevSetPtrBounds(&sum->info,
- (idevPtrBounds *)stuff);
- break;
- case IDEVSETPTR:
- found++;
- if (size>=sizeof(idevPtrVals))
- ok = idevSetPtr(&sum->info,
- (idevPtrVals *)stuff);
- break;
- case IDEVSETTRANSFORM:
- found++;
- if (size>=sizeof(idevGetSetTransform)) {
- ok = idevSetTransform(&sum->info,
- (idevGetSetTransform *)stuff);
- }
- break;
- case IDEVGETTRANSFORM:
- found++;
- if (size>=sizeof(idevGetSetTransform))
- ok = idevGetTransform(&sum->info,
- (idevGetSetTransform *)stuff);
- break;
- case IDEVOTHERCONTROL:
- found++;
- if (size==sizeof(idevOtherControl)) {
- ok = sum_other_control(sum,
- (idevOtherControl *)stuff);
- }
- else ok = 0;
- break;
- case IDEVINITDEVICE:
- found++;
- ok = sum_init(sum);
- break;
- default: /* send other msgs down */
- break; /* FALL THROUGH */
- }
- *pFound= found;
- return ok && found;
- }
-
- /* ARGSUSED */
- static int
- sum_open( queue_t *rq, dev_t *dev, int flag, int sflag, struct cred *cred )
- {
- register sum_state_t *sum;
- register int i;
-
- if ( sflag != MODOPEN )
- return ENXIO ;
-
- if ( !rq->q_ptr ) {
- if ( !(sum = (sum_state_t *)malloc(sizeof *sum)))
- return OPENFAIL;
-
- /* Set defaults -- totally arbitrary, my choice */
- bzero( sum, sizeof *sum ) ;
-
- sum->initialized = 1;
- sum->state = 0;
- sum->origin = SUMMA_ORIGIN_LOWER;
- sum->resolution = SUMMA_RES_1000LPI;
- sum->primary_mode = SUMMA_RPT_STREAM;
- sum->mode_modifier = SUMMA_RATE_MAX;
- sum->data = SUMMA_REGULAR_DATA;
- sum->model = 961;
- sum->xoffset = 0;
- sum->yoffset = 0;
- sum->vals.firstValuator = 0;
- sum->vals.nValuators = SUMMA_NUM_AXES;
- sum->vdesc[0]= _sum_x_val_desc;
- sum->vstate[0]= 0;
- sum->vtrans[0] = idevDfltScale;
- sum->vtrans[0].possible = IDEV_SCALE;
- sum->vtrans[0].which = IDEV_SCALE;
-
- sum->vdesc[1]= _sum_y_val_desc;
- sum->vstate[1]= 0;
- sum->vtrans[1] = idevDfltScale;
- sum->vtrans[1].possible = IDEV_SCALE;
- sum->vtrans[1].which = IDEV_SCALE;
- sum->vactive= SUMMA_ALL_VALUATORS;
- sum->bstate= 0;
- sum->bactive= SUMMA_ALL_BUTTONS;
-
- sum->info.bInfo.nBtn = SUMMA_NUM_BUTTONS;
- sum->info.bInfo.active = &sum->bactive;
- sum->info.bInfo.state = &sum->bstate;
-
- sum->info.vInfo.nVal = SUMMA_NUM_AXES;
- sum->info.vInfo.sysValue = sum->vstate;
- sum->info.vInfo.desc = sum->vdesc;
- sum->info.vInfo.transform = sum->vtrans;
- sum->info.vInfo.active = &sum->vactive;
- sum->info.vInfo.mode = IDEV_GEN_NON_PTR_EVENTS;
- sum->info.pInfo.xTransform = idevDfltScale;
- sum->info.pInfo.yTransform = idevDfltScale;
- sum->info.pInfo.yTransform.flags= IDEV_INVERT;
-
- sum->info.pInfo.xAxis = sum->info.pInfo.yAxis = 255;
- sum->info.pInfo.minX = sum->info.pInfo.minY = 0;
- sum->info.pInfo.maxX = sum->info.pInfo.maxY = 0;
- sum->info.pInfo.x= sum->info.pInfo.y= 0;
-
- sum->info.sInfo.shmiqid.devminor = 0;
- sum->info.sInfo.shmiqid.index = 0;
- sum->info.sInfo.rq = rq;
- sum->info.sInfo.wq = WR(rq);
- sum->info.sInfo.readData = sum_intr;
- sum->info.sInfo.writeIoctl = sum_wioctl;
- WR(rq)->q_ptr = rq->q_ptr = (caddr_t) &sum->info;
- }
-
- return 0;
- }
-
- /* ARGSUSED */
- static int
- sum_close( queue_t *rq, int flag, struct cred *cred )
- {
- sum_state_t *sum = (sum_state_t *)rq->q_ptr;
-
- ASSERT( rq->q_ptr );
- free( (char *)sum );
- return 0;
- }
-
-
-
- /*
- * stream module definition
- */
-
- static struct module_info sum_mod_info = {
- 0, /* module ID */
- SUMMA_NAME, /* module name */
- 0, /* minimum packet size */
- INFPSZ, /* infinite maximum packet size */
- 256, /* hi-water mark */
- 16, /* lo-water mark */
- };
-
- static struct qinit sum_rinit = {
- idev_rput, NULL, sum_open, sum_close,
- NULL, &sum_mod_info, NULL
- };
-
- static struct qinit sum_winit = {
- idev_wput, NULL, NULL, NULL,
- NULL, &sum_mod_info, NULL
- } ;
-
- /* ********************* Only visible STREAMS structure ********************* */
- struct streamtab summainfo = {
- &sum_rinit, &sum_winit, 0, 0
- } ;
-